﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Net;

namespace Presentation
{
    public partial class main : System.Web.UI.MasterPage
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Cache.Get("calendario") != null)
            {
                Table calendario = (Table)Cache.Get("calendario");

                for (int i = (calendario.Rows.Count - 1); i > 0; i--)
                    this.tblCalendario.Rows.AddAt(1, calendario.Rows[i]);

                tblCalendario.Caption = Util.buscarMesPorExtenso(DateTime.Today.Month) + " " + DateTime.Today.Year;
                Cache.Insert("calendario", tblCalendario, null, new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(1), System.Web.Caching.Cache.NoSlidingExpiration);
            }
            else
                montarCalendario();

            if (!IsPostBack)
            {
                verificarAdmin();

                atualizarVersiculoDia();
            }

            montarBoletim();
        }

        private void verificarAdmin()
        {
            DEUsuario user = Session["usuario"] as DEUsuario;

            divAdmin.Visible = user != null && user.Admin;
            divLogin.Visible = user == null;
        }

        private void montarCalendario()
        {
            tblCalendario.Caption = Util.buscarMesPorExtenso(DateTime.Today.Month) + " " + DateTime.Today.Year;

            DateTime primeiroDia = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);
            DateTime ultimoDia = new DateTime();
            bool naoExiste = true;
            int dia = 31;
            while (naoExiste)
            {
                try
                {
                    ultimoDia = new DateTime(primeiroDia.Year, primeiroDia.Month, dia);
                    naoExiste = false;
                }
                catch (Exception)
                {
                    dia--;
                }
            }

            preencherCalendario(primeiroDia, ultimoDia);

            Cache.Insert("calendario", tblCalendario, null, ultimoDia.AddDays(1), System.Web.Caching.Cache.NoSlidingExpiration);
        }

        private void montarBoletim()
        {
            List<DEBoletim> lista = new List<DEBoletim>();
            using (ministerioprosperid1Entities bd = new ministerioprosperid1Entities())
            {
                lista = bd.DEBoletims.Where(q => q.Ativo && q.Ano == DateTime.Today.Year).OrderByDescending(q => q.Mes).ToList();
            }

            rptBoletim.DataSource = lista;
            rptBoletim.DataBind();
        }

        private void preencherCalendario(DateTime primeiroDia, DateTime ultimoDia)
        {
            TableRow row = preencherDiasMesAnterior(primeiroDia);

            row = preencherDiasMesAtual(primeiroDia, ultimoDia, row);

            preencherDiasMesProximo(ultimoDia, row);

            preencherEventos(primeiroDia, ultimoDia);
        }

        private void preencherEventos(DateTime primeiroDia, DateTime ultimoDia)
        {
            try
            {
                #region Fixos
                //Preenche eventos fixos(Santa Ceia / Vigília)
                if (primeiroDia.DayOfWeek == DayOfWeek.Sunday)
                {
                    tblCalendario.Rows[1].Cells[0].CssClass += " importante";
                    tblCalendario.Rows[1].Cells[0].ToolTip = "Santa Ceia do Senhor";
                }
                else
                {
                    //Início da Semana de Oração
                    tblCalendario.Rows[1].Cells[0].CssClass += " importante";
                    tblCalendario.Rows[1].Cells[0].ToolTip = "Início da Semana de Oração";

                    //Vigília
                    tblCalendario.Rows[1].Cells[5].CssClass += " importante";
                    tblCalendario.Rows[1].Cells[5].ToolTip = "Vigília";

                    //Santa Ceia do Senhor
                    tblCalendario.Rows[2].Cells[0].CssClass += " importante";
                    tblCalendario.Rows[2].Cells[0].ToolTip = "Santa Ceia do Senhor";
                }

                int indice = tblCalendario.Rows.Count - 1;
                //Início da Semana de Oração
                tblCalendario.Rows[indice].Cells[0].CssClass += " importante";
                tblCalendario.Rows[indice].Cells[0].ToolTip = "Início da Semana de Oração";

                //Vigília
                tblCalendario.Rows[indice].Cells[5].CssClass += " importante";
                tblCalendario.Rows[indice].Cells[5].ToolTip = "Vigília";
                #endregion

                #region Dinamicos

                int diaMaximo = int.Parse(tblCalendario.Rows[indice].Cells[6].Text);

                using (ministerioprosperid1Entities banco = new ministerioprosperid1Entities())
                {
                    var q = from e in banco.DEEventoes
                            where
                                e.Data.Month == DateTime.Today.Month
                            orderby e.Data ascending
                            select e;

                    List<DEEvento> eventos = q.ToList();
                    if (eventos != null && eventos.Count > 0)
                    {
                        int eventosUsados = 0;
                        for (int i = 1; i <= ultimoDia.Day; i++)
                        {
                            if (eventos.Any(j => j.Data.Day == i))
                            {
                                int linhaEvento = 0;
                                int colunaEvento = 0;
                                for (int linha = 1; linha < tblCalendario.Rows.Count; linha++)
                                {
                                    int inicio = int.Parse(tblCalendario.Rows[linha].Cells[0].Text);
                                    int fim = int.Parse(tblCalendario.Rows[linha].Cells[6].Text);

                                    if (i <= fim || linha == tblCalendario.Rows.Count - 1)
                                    {
                                        linhaEvento = linha;

                                        foreach (TableCell item in tblCalendario.Rows[linhaEvento].Cells)
                                        {
                                            if (i == int.Parse(item.Text))
                                            {
                                                colunaEvento = tblCalendario.Rows[linhaEvento].Cells.GetCellIndex(item);
                                                break;
                                            }
                                        }

                                        break;
                                    }
                                }

                                if (!tblCalendario.Rows[linhaEvento].Cells[colunaEvento].CssClass.Contains("importante"))
                                {
                                    tblCalendario.Rows[linhaEvento].Cells[colunaEvento].CssClass += " importante";
                                    tblCalendario.Rows[linhaEvento].Cells[colunaEvento].ToolTip = eventos.First(eve => eve.Data.Day == i).Nome;
                                }
                                else
                                    tblCalendario.Rows[linhaEvento].Cells[colunaEvento].ToolTip = " e " + eventos.First(eve => eve.Data.Day == i).Nome;

                                eventosUsados++;
                            }

                            if (eventosUsados == eventos.Count)
                                break;
                        }
                    }
                }

                #endregion
            }
            catch (Exception)
            {
            }
        }

        private TableRow preencherDiasMesAtual(DateTime primeiroDia, DateTime ultimoDia, TableRow row)
        {
            try
            {
                if (row == null)
                    row = new TableRow();

                TableCell cell;
                for (int i = 0; i < ultimoDia.Day; i++)
                {
                    if (primeiroDia.AddDays(i).DayOfWeek == DayOfWeek.Sunday && i != 0)
                    {
                        tblCalendario.Rows.Add(row);
                        row = new TableRow();
                    }

                    cell = new TableCell();
                    cell.Text = (i + 1).ToString().PadLeft(2, '0');

                    row.Cells.Add(cell);
                }

                return row;
            }
            catch (Exception)
            {
                return new TableRow();
            }
        }

        private void preencherDiasMesProximo(DateTime ultimoDia, TableRow row)
        {
            try
            {
                if (ultimoDia.DayOfWeek != DayOfWeek.Saturday)
                {
                    TableCell cell;

                    int i = 1;
                    while (ultimoDia.AddDays(i).DayOfWeek != DayOfWeek.Sunday)
                    {
                        cell = new TableCell();
                        cell.CssClass = "proximoMes";
                        cell.Text = (i++).ToString().PadLeft(2, '0');

                        row.Cells.Add(cell);
                    }
                }

                tblCalendario.Rows.Add(row);
            }
            catch (Exception)
            {
            }
        }

        private TableRow preencherDiasMesAnterior(DateTime primeiroDia)
        {
            try
            {
                int diasAnteriores = (int)primeiroDia.DayOfWeek;

                TableRow row = new TableRow();
                for (int i = diasAnteriores; i > 0; i--)
                {
                    TableCell cell = new TableCell();
                    cell.CssClass = "proximoMes";

                    if (primeiroDia.AddDays((-1 * i)).DayOfWeek == DayOfWeek.Sunday && i != diasAnteriores)
                    {
                        tblCalendario.Rows.Add(row);
                        row = new TableRow();
                    }
                    cell.Text = primeiroDia.AddDays((-1 * i)).Day.ToString();

                    row.Cells.Add(cell);
                }

                if (row.Cells.Count == 7)
                    return new TableRow();
                else
                    return row;
            }
            catch (Exception)
            {
                return new TableRow();
            }
        }

        protected void lkbBoletim_Click(object sender, EventArgs e)
        {
            LinkButton btn = sender as LinkButton;

            string caminhoFisico = Server.MapPath("~/Boletins/" + btn.CommandArgument + ".pdf");
            FileInfo arquivo = new FileInfo(caminhoFisico);

            try
            {
                Response.ContentType = "Application/pdf";
                Response.AppendHeader("Content-Disposition", "attachment; filename=" + arquivo.Name);
                Response.TransmitFile(caminhoFisico);
                Response.End();
            }
            catch (Exception)
            {
                Response.Write("<script>alert('Desculpe-nos, houve um erro ao tentar fazer o download do boletim.');</script>");
            }
        }

        private void atualizarVersiculoDia()
        {
            try
            {
                string versiculo = String.Empty;
                using (StreamReader sr = new StreamReader(Server.MapPath("~") + "versiculoDia.txt"))
                {
                    versiculo = sr.ReadLine();
                    if (!String.IsNullOrEmpty(versiculo))
                    {
                        string[] versiculoDados = versiculo.Split('|');
                        if (versiculoDados[0] == DateTime.Today.Day.ToString())
                            lblVersiculoDia.Text = versiculoDados[2];
                        else
                            versiculo = versiculoDados[1];
                    }
                    sr.Close();
                }
                buscarNovoVersiculo(versiculo);
            }
            catch (Exception)
            {
                lblVersiculoDia.Text = "Não encontrado...";
            }
        }

        private void buscarNovoVersiculo(string versiculo)
        {
            try
            {
                using (ministerioprosperid1Entities banco = new ministerioprosperid1Entities())
                {
                    DEVersiculo novo = null;
                    if (!String.IsNullOrEmpty(versiculo))
                    {
                        int codigo = Convert.ToInt32(versiculo);
                        novo = banco.DEVersiculoes.FirstOrDefault(q => q.Codigo > codigo);
                    }

                    if (novo == null)
                        novo = banco.DEVersiculoes.First();

                    lblVersiculoDia.Text = novo.Versiculo;
                    using (StreamWriter sw = new StreamWriter(Server.MapPath("~") + "versiculoDia.txt"))
                    {
                        sw.Write(DateTime.Today.Day + "|" + novo.Codigo + "|" + novo.Versiculo);
                        sw.Close();
                    }
                }
            }
            catch (Exception)
            {
            }
        }
    }
}